Optimize table layout
authorErik Schnetter <schnetter@gmail.com>
Sun, 29 Dec 2024 18:38:01 +0000 (13:38 -0500)
committerErik Schnetter <schnetter@gmail.com>
Sun, 29 Dec 2024 18:38:01 +0000 (13:38 -0500)
data/data_generator.jl
utf8proc.c
utf8proc.h
utf8proc_data.c

index 0c063aa13966e6292cb02804286563a721f6de74..e55657fb7e82788241b6ccc6b10681668fd44a50 100644 (file)
@@ -469,12 +469,24 @@ function print_c_data_tables(io, sequences, prop_page_indices, prop_pages, dedup
     end
     print(io, "};\n\n")
 
-    print(io, "static const utf8proc_uint32_t utf8proc_combinations[][2] = {\n")
+    print(io, "static const utf8proc_uint32_t utf8proc_combinations_second[] = {\n")
     for dm0 in sort!(collect(keys(comb_mapping)))
+        print(io, " ");
+        for dm1 in sort!(collect(keys(comb_mapping[dm0])))
+            print(io, " ", dm1, ",")
+        end
+        print(io, "\n");
+    end
+    print(io, "};\n\n")
+
+    print(io, "static const utf8proc_uint32_t utf8proc_combinations_combined[] = {\n")
+    for dm0 in sort!(collect(keys(comb_mapping)))
+        print(io, " ");
         for dm1 in sort!(collect(keys(comb_mapping[dm0])))
             code = comb_mapping[dm0][dm1]
-            print(io, "  {", dm1, ", ", code, "},\n")
+            print(io, " ", code, ",")
         end
+        print(io, "\n");
     end
     print(io, "};\n\n")
 end
index 7effa9257965e15daccc8bab95186acb35aa6aa3..5149e75a2e219cd8f9053d726c62acbe33ebc6f6 100644 (file)
@@ -687,18 +687,18 @@ UTF8PROC_DLLEXPORT utf8proc_ssize_t utf8proc_normalize_utf32(utf8proc_int32_t *b
         int idx = starter_property->comb_index;
         if (idx < 0x3FF && current_property->comb_issecond) {
           int len = starter_property->comb_length;
-          utf8proc_uint32_t max_second = utf8proc_combinations[idx + len - 1][0];
+          utf8proc_uint32_t max_second = utf8proc_combinations_second[idx + len - 1];
           if (current_char <= max_second) {
             // TODO: binary search? arithmetic search?
             for (int off = 0; off < len; ++off) {
-              utf8proc_uint32_t second = utf8proc_combinations[idx + off][0];
+              utf8proc_uint32_t second = utf8proc_combinations_second[idx + off];
               if (current_char < second) {
                 /* not found */
                 break;
               }
               if (current_char == second) {
                 /* found */
-                utf8proc_uint32_t composition = utf8proc_combinations[idx + off][1];
+                utf8proc_uint32_t composition = utf8proc_combinations_combined[idx + off];
                 *starter = composition;
                 starter_property = NULL;
                 break;
index a21b6bbb30334550aefb7e6f476ecafe236bd2f8..4bab22bcdabc8d8bdbc774855e7cc4740c066767 100644 (file)
@@ -266,10 +266,12 @@ typedef struct utf8proc_property_struct {
    * combining pair, and for most, there are only a handful for
    * possible second characters.
    *
-   * The combining table is stored as `utf8proc_uint32_t
-   * utf8proc_combinations[][2]`. That is, it contains a pair `(second
-   * combining character, combined character)` for every character
-   * that can be a first combining character.
+   * The combining table is stored as sparse matrix in the CSR
+   * (compressed sparse row) format. That is, it is stored as two
+   * arrays, `utf8proc_uint32_t utf8proc_combinations_second[]` and
+   * `utf8proc_uint32_t utf8proc_combinations_combined[]`. These
+   * contain the second combining characters and the combined
+   * character of every combining pair.
    *
    * - `comb_index`: Index into the combining table if this character
    *   is the first character in a combining pair, else 0x3ff
index d2b0a5ecc176769bfec2cc73bda14c481abadc46..469a432793efc5a347228b70009c6bf2523ccba3 100644 (file)
@@ -16316,967 +16316,791 @@ static const utf8proc_property_t utf8proc_properties[] = {
   {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_BN, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, true, true, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND},
 };
 
-static const utf8proc_uint32_t utf8proc_combinations[][2] = {
-  {824, 8814},
-  {824, 8800},
-  {824, 8815},
-  {768, 192},
-  {769, 193},
-  {770, 194},
-  {771, 195},
-  {772, 256},
-  {774, 258},
-  {775, 550},
-  {776, 196},
-  {777, 7842},
-  {778, 197},
-  {780, 461},
-  {783, 512},
-  {785, 514},
-  {803, 7840},
-  {805, 7680},
-  {808, 260},
-  {775, 7682},
-  {803, 7684},
-  {817, 7686},
-  {769, 262},
-  {770, 264},
-  {775, 266},
-  {780, 268},
-  {807, 199},
-  {775, 7690},
-  {780, 270},
-  {803, 7692},
-  {807, 7696},
-  {813, 7698},
-  {817, 7694},
-  {768, 200},
-  {769, 201},
-  {770, 202},
-  {771, 7868},
-  {772, 274},
-  {774, 276},
-  {775, 278},
-  {776, 203},
-  {777, 7866},
-  {780, 282},
-  {783, 516},
-  {785, 518},
-  {803, 7864},
-  {807, 552},
-  {808, 280},
-  {813, 7704},
-  {816, 7706},
-  {775, 7710},
-  {769, 500},
-  {770, 284},
-  {772, 7712},
-  {774, 286},
-  {775, 288},
-  {780, 486},
-  {807, 290},
-  {770, 292},
-  {775, 7714},
-  {776, 7718},
-  {780, 542},
-  {803, 7716},
-  {807, 7720},
-  {814, 7722},
-  {768, 204},
-  {769, 205},
-  {770, 206},
-  {771, 296},
-  {772, 298},
-  {774, 300},
-  {775, 304},
-  {776, 207},
-  {777, 7880},
-  {780, 463},
-  {783, 520},
-  {785, 522},
-  {803, 7882},
-  {808, 302},
-  {816, 7724},
-  {770, 308},
-  {769, 7728},
-  {780, 488},
-  {803, 7730},
-  {807, 310},
-  {817, 7732},
-  {769, 313},
-  {780, 317},
-  {803, 7734},
-  {807, 315},
-  {813, 7740},
-  {817, 7738},
-  {769, 7742},
-  {775, 7744},
-  {803, 7746},
-  {768, 504},
-  {769, 323},
-  {771, 209},
-  {775, 7748},
-  {780, 327},
-  {803, 7750},
-  {807, 325},
-  {813, 7754},
-  {817, 7752},
-  {768, 210},
-  {769, 211},
-  {770, 212},
-  {771, 213},
-  {772, 332},
-  {774, 334},
-  {775, 558},
-  {776, 214},
-  {777, 7886},
-  {779, 336},
-  {780, 465},
-  {783, 524},
-  {785, 526},
-  {795, 416},
-  {803, 7884},
-  {808, 490},
-  {769, 7764},
-  {775, 7766},
-  {769, 340},
-  {775, 7768},
-  {780, 344},
-  {783, 528},
-  {785, 530},
-  {803, 7770},
-  {807, 342},
-  {817, 7774},
-  {769, 346},
-  {770, 348},
-  {775, 7776},
-  {780, 352},
-  {803, 7778},
-  {806, 536},
-  {807, 350},
-  {775, 7786},
-  {780, 356},
-  {803, 7788},
-  {806, 538},
-  {807, 354},
-  {813, 7792},
-  {817, 7790},
-  {768, 217},
-  {769, 218},
-  {770, 219},
-  {771, 360},
-  {772, 362},
-  {774, 364},
-  {776, 220},
-  {777, 7910},
-  {778, 366},
-  {779, 368},
-  {780, 467},
-  {783, 532},
-  {785, 534},
-  {795, 431},
-  {803, 7908},
-  {804, 7794},
-  {808, 370},
-  {813, 7798},
-  {816, 7796},
-  {771, 7804},
-  {803, 7806},
-  {768, 7808},
-  {769, 7810},
-  {770, 372},
-  {775, 7814},
-  {776, 7812},
-  {803, 7816},
-  {775, 7818},
-  {776, 7820},
-  {768, 7922},
-  {769, 221},
-  {770, 374},
-  {771, 7928},
-  {772, 562},
-  {775, 7822},
-  {776, 376},
-  {777, 7926},
-  {803, 7924},
-  {769, 377},
-  {770, 7824},
-  {775, 379},
-  {780, 381},
-  {803, 7826},
-  {817, 7828},
-  {768, 224},
-  {769, 225},
-  {770, 226},
-  {771, 227},
-  {772, 257},
-  {774, 259},
-  {775, 551},
-  {776, 228},
-  {777, 7843},
-  {778, 229},
-  {780, 462},
-  {783, 513},
-  {785, 515},
-  {803, 7841},
-  {805, 7681},
-  {808, 261},
-  {775, 7683},
-  {803, 7685},
-  {817, 7687},
-  {769, 263},
-  {770, 265},
-  {775, 267},
-  {780, 269},
-  {807, 231},
-  {775, 7691},
-  {780, 271},
-  {803, 7693},
-  {807, 7697},
-  {813, 7699},
-  {817, 7695},
-  {768, 232},
-  {769, 233},
-  {770, 234},
-  {771, 7869},
-  {772, 275},
-  {774, 277},
-  {775, 279},
-  {776, 235},
-  {777, 7867},
-  {780, 283},
-  {783, 517},
-  {785, 519},
-  {803, 7865},
-  {807, 553},
-  {808, 281},
-  {813, 7705},
-  {816, 7707},
-  {775, 7711},
-  {769, 501},
-  {770, 285},
-  {772, 7713},
-  {774, 287},
-  {775, 289},
-  {780, 487},
-  {807, 291},
-  {770, 293},
-  {775, 7715},
-  {776, 7719},
-  {780, 543},
-  {803, 7717},
-  {807, 7721},
-  {814, 7723},
-  {817, 7830},
-  {768, 236},
-  {769, 237},
-  {770, 238},
-  {771, 297},
-  {772, 299},
-  {774, 301},
-  {776, 239},
-  {777, 7881},
-  {780, 464},
-  {783, 521},
-  {785, 523},
-  {803, 7883},
-  {808, 303},
-  {816, 7725},
-  {770, 309},
-  {780, 496},
-  {769, 7729},
-  {780, 489},
-  {803, 7731},
-  {807, 311},
-  {817, 7733},
-  {769, 314},
-  {780, 318},
-  {803, 7735},
-  {807, 316},
-  {813, 7741},
-  {817, 7739},
-  {769, 7743},
-  {775, 7745},
-  {803, 7747},
-  {768, 505},
-  {769, 324},
-  {771, 241},
-  {775, 7749},
-  {780, 328},
-  {803, 7751},
-  {807, 326},
-  {813, 7755},
-  {817, 7753},
-  {768, 242},
-  {769, 243},
-  {770, 244},
-  {771, 245},
-  {772, 333},
-  {774, 335},
-  {775, 559},
-  {776, 246},
-  {777, 7887},
-  {779, 337},
-  {780, 466},
-  {783, 525},
-  {785, 527},
-  {795, 417},
-  {803, 7885},
-  {808, 491},
-  {769, 7765},
-  {775, 7767},
-  {769, 341},
-  {775, 7769},
-  {780, 345},
-  {783, 529},
-  {785, 531},
-  {803, 7771},
-  {807, 343},
-  {817, 7775},
-  {769, 347},
-  {770, 349},
-  {775, 7777},
-  {780, 353},
-  {803, 7779},
-  {806, 537},
-  {807, 351},
-  {775, 7787},
-  {776, 7831},
-  {780, 357},
-  {803, 7789},
-  {806, 539},
-  {807, 355},
-  {813, 7793},
-  {817, 7791},
-  {768, 249},
-  {769, 250},
-  {770, 251},
-  {771, 361},
-  {772, 363},
-  {774, 365},
-  {776, 252},
-  {777, 7911},
-  {778, 367},
-  {779, 369},
-  {780, 468},
-  {783, 533},
-  {785, 535},
-  {795, 432},
-  {803, 7909},
-  {804, 7795},
-  {808, 371},
-  {813, 7799},
-  {816, 7797},
-  {771, 7805},
-  {803, 7807},
-  {768, 7809},
-  {769, 7811},
-  {770, 373},
-  {775, 7815},
-  {776, 7813},
-  {778, 7832},
-  {803, 7817},
-  {775, 7819},
-  {776, 7821},
-  {768, 7923},
-  {769, 253},
-  {770, 375},
-  {771, 7929},
-  {772, 563},
-  {775, 7823},
-  {776, 255},
-  {777, 7927},
-  {778, 7833},
-  {803, 7925},
-  {769, 378},
-  {770, 7825},
-  {775, 380},
-  {780, 382},
-  {803, 7827},
-  {817, 7829},
-  {768, 8173},
-  {769, 901},
-  {834, 8129},
-  {768, 7846},
-  {769, 7844},
-  {771, 7850},
-  {777, 7848},
-  {772, 478},
-  {769, 506},
-  {769, 508},
-  {772, 482},
-  {769, 7688},
-  {768, 7872},
-  {769, 7870},
-  {771, 7876},
-  {777, 7874},
-  {769, 7726},
-  {768, 7890},
-  {769, 7888},
-  {771, 7894},
-  {777, 7892},
-  {769, 7756},
-  {772, 556},
-  {776, 7758},
-  {772, 554},
-  {769, 510},
-  {768, 475},
-  {769, 471},
-  {772, 469},
-  {780, 473},
-  {768, 7847},
-  {769, 7845},
-  {771, 7851},
-  {777, 7849},
-  {772, 479},
-  {769, 507},
-  {769, 509},
-  {772, 483},
-  {769, 7689},
-  {768, 7873},
-  {769, 7871},
-  {771, 7877},
-  {777, 7875},
-  {769, 7727},
-  {768, 7891},
-  {769, 7889},
-  {771, 7895},
-  {777, 7893},
-  {769, 7757},
-  {772, 557},
-  {776, 7759},
-  {772, 555},
-  {769, 511},
-  {768, 476},
-  {769, 472},
-  {772, 470},
-  {780, 474},
-  {768, 7856},
-  {769, 7854},
-  {771, 7860},
-  {777, 7858},
-  {768, 7857},
-  {769, 7855},
-  {771, 7861},
-  {777, 7859},
-  {768, 7700},
-  {769, 7702},
-  {768, 7701},
-  {769, 7703},
-  {768, 7760},
-  {769, 7762},
-  {768, 7761},
-  {769, 7763},
-  {775, 7780},
-  {775, 7781},
-  {775, 7782},
-  {775, 7783},
-  {769, 7800},
-  {769, 7801},
-  {776, 7802},
-  {776, 7803},
-  {775, 7835},
-  {768, 7900},
-  {769, 7898},
-  {771, 7904},
-  {777, 7902},
-  {803, 7906},
-  {768, 7901},
-  {769, 7899},
-  {771, 7905},
-  {777, 7903},
-  {803, 7907},
-  {768, 7914},
-  {769, 7912},
-  {771, 7918},
-  {777, 7916},
-  {803, 7920},
-  {768, 7915},
-  {769, 7913},
-  {771, 7919},
-  {777, 7917},
-  {803, 7921},
-  {780, 494},
-  {772, 492},
-  {772, 493},
-  {772, 480},
-  {772, 481},
-  {774, 7708},
-  {774, 7709},
-  {772, 560},
-  {772, 561},
-  {780, 495},
-  {768, 8122},
-  {769, 902},
-  {772, 8121},
-  {774, 8120},
-  {787, 7944},
-  {788, 7945},
-  {837, 8124},
-  {768, 8136},
-  {769, 904},
-  {787, 7960},
-  {788, 7961},
-  {768, 8138},
-  {769, 905},
-  {787, 7976},
-  {788, 7977},
-  {837, 8140},
-  {768, 8154},
-  {769, 906},
-  {772, 8153},
-  {774, 8152},
-  {776, 938},
-  {787, 7992},
-  {788, 7993},
-  {768, 8184},
-  {769, 908},
-  {787, 8008},
-  {788, 8009},
-  {788, 8172},
-  {768, 8170},
-  {769, 910},
-  {772, 8169},
-  {774, 8168},
-  {776, 939},
-  {788, 8025},
-  {768, 8186},
-  {769, 911},
-  {787, 8040},
-  {788, 8041},
-  {837, 8188},
-  {837, 8116},
-  {837, 8132},
-  {768, 8048},
-  {769, 940},
-  {772, 8113},
-  {774, 8112},
-  {787, 7936},
-  {788, 7937},
-  {834, 8118},
-  {837, 8115},
-  {768, 8050},
-  {769, 941},
-  {787, 7952},
-  {788, 7953},
-  {768, 8052},
-  {769, 942},
-  {787, 7968},
-  {788, 7969},
-  {834, 8134},
-  {837, 8131},
-  {768, 8054},
-  {769, 943},
-  {772, 8145},
-  {774, 8144},
-  {776, 970},
-  {787, 7984},
-  {788, 7985},
-  {834, 8150},
-  {768, 8056},
-  {769, 972},
-  {787, 8000},
-  {788, 8001},
-  {787, 8164},
-  {788, 8165},
-  {768, 8058},
-  {769, 973},
-  {772, 8161},
-  {774, 8160},
-  {776, 971},
-  {787, 8016},
-  {788, 8017},
-  {834, 8166},
-  {768, 8060},
-  {769, 974},
-  {787, 8032},
-  {788, 8033},
-  {834, 8182},
-  {837, 8179},
-  {768, 8146},
-  {769, 912},
-  {834, 8151},
-  {768, 8162},
-  {769, 944},
-  {834, 8167},
-  {837, 8180},
-  {769, 979},
-  {776, 980},
-  {776, 1031},
-  {774, 1232},
-  {776, 1234},
-  {769, 1027},
-  {768, 1024},
-  {774, 1238},
-  {776, 1025},
-  {774, 1217},
-  {776, 1244},
-  {776, 1246},
-  {768, 1037},
-  {772, 1250},
-  {774, 1049},
-  {776, 1252},
-  {769, 1036},
-  {776, 1254},
-  {772, 1262},
-  {774, 1038},
-  {776, 1264},
-  {779, 1266},
-  {776, 1268},
-  {776, 1272},
-  {776, 1260},
-  {774, 1233},
-  {776, 1235},
-  {769, 1107},
-  {768, 1104},
-  {774, 1239},
-  {776, 1105},
-  {774, 1218},
-  {776, 1245},
-  {776, 1247},
-  {768, 1117},
-  {772, 1251},
-  {774, 1081},
-  {776, 1253},
-  {769, 1116},
-  {776, 1255},
-  {772, 1263},
-  {774, 1118},
-  {776, 1265},
-  {779, 1267},
-  {776, 1269},
-  {776, 1273},
-  {776, 1261},
-  {776, 1111},
-  {783, 1142},
-  {783, 1143},
-  {776, 1242},
-  {776, 1243},
-  {776, 1258},
-  {776, 1259},
-  {1619, 1570},
-  {1620, 1571},
-  {1621, 1573},
-  {1620, 1572},
-  {1620, 1574},
-  {1620, 1730},
-  {1620, 1747},
-  {1620, 1728},
-  {2364, 2345},
-  {2364, 2353},
-  {2364, 2356},
-  {2494, 2507},
-  {2519, 2508},
-  {2878, 2891},
-  {2902, 2888},
-  {2903, 2892},
-  {3031, 2964},
-  {3006, 3018},
-  {3031, 3020},
-  {3006, 3019},
-  {3158, 3144},
-  {3285, 3264},
-  {3266, 3274},
-  {3285, 3271},
-  {3286, 3272},
-  {3285, 3275},
-  {3390, 3402},
-  {3415, 3404},
-  {3390, 3403},
-  {3530, 3546},
-  {3535, 3548},
-  {3551, 3550},
-  {3530, 3549},
-  {4142, 4134},
-  {6965, 6918},
-  {6965, 6920},
-  {6965, 6922},
-  {6965, 6924},
-  {6965, 6926},
-  {6965, 6930},
-  {6965, 6971},
-  {6965, 6973},
-  {6965, 6976},
-  {6965, 6977},
-  {6965, 6979},
-  {772, 7736},
-  {772, 7737},
-  {772, 7772},
-  {772, 7773},
-  {775, 7784},
-  {775, 7785},
-  {770, 7852},
-  {774, 7862},
-  {770, 7853},
-  {774, 7863},
-  {770, 7878},
-  {770, 7879},
-  {770, 7896},
-  {770, 7897},
-  {768, 7938},
-  {769, 7940},
-  {834, 7942},
-  {837, 8064},
-  {768, 7939},
-  {769, 7941},
-  {834, 7943},
-  {837, 8065},
-  {837, 8066},
-  {837, 8067},
-  {837, 8068},
-  {837, 8069},
-  {837, 8070},
-  {837, 8071},
-  {768, 7946},
-  {769, 7948},
-  {834, 7950},
-  {837, 8072},
-  {768, 7947},
-  {769, 7949},
-  {834, 7951},
-  {837, 8073},
-  {837, 8074},
-  {837, 8075},
-  {837, 8076},
-  {837, 8077},
-  {837, 8078},
-  {837, 8079},
-  {768, 7954},
-  {769, 7956},
-  {768, 7955},
-  {769, 7957},
-  {768, 7962},
-  {769, 7964},
-  {768, 7963},
-  {769, 7965},
-  {768, 7970},
-  {769, 7972},
-  {834, 7974},
-  {837, 8080},
-  {768, 7971},
-  {769, 7973},
-  {834, 7975},
-  {837, 8081},
-  {837, 8082},
-  {837, 8083},
-  {837, 8084},
-  {837, 8085},
-  {837, 8086},
-  {837, 8087},
-  {768, 7978},
-  {769, 7980},
-  {834, 7982},
-  {837, 8088},
-  {768, 7979},
-  {769, 7981},
-  {834, 7983},
-  {837, 8089},
-  {837, 8090},
-  {837, 8091},
-  {837, 8092},
-  {837, 8093},
-  {837, 8094},
-  {837, 8095},
-  {768, 7986},
-  {769, 7988},
-  {834, 7990},
-  {768, 7987},
-  {769, 7989},
-  {834, 7991},
-  {768, 7994},
-  {769, 7996},
-  {834, 7998},
-  {768, 7995},
-  {769, 7997},
-  {834, 7999},
-  {768, 8002},
-  {769, 8004},
-  {768, 8003},
-  {769, 8005},
-  {768, 8010},
-  {769, 8012},
-  {768, 8011},
-  {769, 8013},
-  {768, 8018},
-  {769, 8020},
-  {834, 8022},
-  {768, 8019},
-  {769, 8021},
-  {834, 8023},
-  {768, 8027},
-  {769, 8029},
-  {834, 8031},
-  {768, 8034},
-  {769, 8036},
-  {834, 8038},
-  {837, 8096},
-  {768, 8035},
-  {769, 8037},
-  {834, 8039},
-  {837, 8097},
-  {837, 8098},
-  {837, 8099},
-  {837, 8100},
-  {837, 8101},
-  {837, 8102},
-  {837, 8103},
-  {768, 8042},
-  {769, 8044},
-  {834, 8046},
-  {837, 8104},
-  {768, 8043},
-  {769, 8045},
-  {834, 8047},
-  {837, 8105},
-  {837, 8106},
-  {837, 8107},
-  {837, 8108},
-  {837, 8109},
-  {837, 8110},
-  {837, 8111},
-  {837, 8114},
-  {837, 8130},
-  {837, 8178},
-  {837, 8119},
-  {768, 8141},
-  {769, 8142},
-  {834, 8143},
-  {837, 8135},
-  {837, 8183},
-  {768, 8157},
-  {769, 8158},
-  {834, 8159},
-  {824, 8602},
-  {824, 8603},
-  {824, 8622},
-  {824, 8653},
-  {824, 8655},
-  {824, 8654},
-  {824, 8708},
-  {824, 8713},
-  {824, 8716},
-  {824, 8740},
-  {824, 8742},
-  {824, 8769},
-  {824, 8772},
-  {824, 8775},
-  {824, 8777},
-  {824, 8813},
-  {824, 8802},
-  {824, 8816},
-  {824, 8817},
-  {824, 8820},
-  {824, 8821},
-  {824, 8824},
-  {824, 8825},
-  {824, 8832},
-  {824, 8833},
-  {824, 8928},
-  {824, 8929},
-  {824, 8836},
-  {824, 8837},
-  {824, 8840},
-  {824, 8841},
-  {824, 8930},
-  {824, 8931},
-  {824, 8876},
-  {824, 8877},
-  {824, 8878},
-  {824, 8879},
-  {824, 8938},
-  {824, 8939},
-  {824, 8940},
-  {824, 8941},
-  {12441, 12436},
-  {12441, 12364},
-  {12441, 12366},
-  {12441, 12368},
-  {12441, 12370},
-  {12441, 12372},
-  {12441, 12374},
-  {12441, 12376},
-  {12441, 12378},
-  {12441, 12380},
-  {12441, 12382},
-  {12441, 12384},
-  {12441, 12386},
-  {12441, 12389},
-  {12441, 12391},
-  {12441, 12393},
-  {12441, 12400},
-  {12442, 12401},
-  {12441, 12403},
-  {12442, 12404},
-  {12441, 12406},
-  {12442, 12407},
-  {12441, 12409},
-  {12442, 12410},
-  {12441, 12412},
-  {12442, 12413},
-  {12441, 12446},
-  {12441, 12532},
-  {12441, 12460},
-  {12441, 12462},
-  {12441, 12464},
-  {12441, 12466},
-  {12441, 12468},
-  {12441, 12470},
-  {12441, 12472},
-  {12441, 12474},
-  {12441, 12476},
-  {12441, 12478},
-  {12441, 12480},
-  {12441, 12482},
-  {12441, 12485},
-  {12441, 12487},
-  {12441, 12489},
-  {12441, 12496},
-  {12442, 12497},
-  {12441, 12499},
-  {12442, 12500},
-  {12441, 12502},
-  {12442, 12503},
-  {12441, 12505},
-  {12442, 12506},
-  {12441, 12508},
-  {12442, 12509},
-  {12441, 12535},
-  {12441, 12536},
-  {12441, 12537},
-  {12441, 12538},
-  {12441, 12542},
-  {775, 67017},
-  {775, 67044},
-  {69818, 69786},
-  {69818, 69788},
-  {69818, 69803},
-  {69927, 69934},
-  {69927, 69935},
-  {70462, 70475},
-  {70487, 70476},
-  {70601, 70531},
-  {70587, 70533},
-  {70594, 70542},
-  {70601, 70545},
-  {70584, 70599},
-  {70594, 70597},
-  {70601, 70600},
-  {70832, 70844},
-  {70842, 70843},
-  {70845, 70846},
-  {71087, 71098},
-  {71087, 71099},
-  {71984, 71992},
-  {90398, 90401},
-  {90399, 90403},
-  {90400, 90405},
-  {90409, 90402},
-  {90399, 90406},
-  {90400, 90408},
-  {90399, 90407},
-  {90399, 90404},
-  {93543, 93545},
-  {93543, 93544},
-  {93543, 93546},
+static const utf8proc_uint32_t utf8proc_combinations_second[] = {
+  824,
+  824,
+  824,
+  768, 769, 770, 771, 772, 774, 775, 776, 777, 778, 780, 783, 785, 803, 805, 808,
+  775, 803, 817,
+  769, 770, 775, 780, 807,
+  775, 780, 803, 807, 813, 817,
+  768, 769, 770, 771, 772, 774, 775, 776, 777, 780, 783, 785, 803, 807, 808, 813, 816,
+  775,
+  769, 770, 772, 774, 775, 780, 807,
+  770, 775, 776, 780, 803, 807, 814,
+  768, 769, 770, 771, 772, 774, 775, 776, 777, 780, 783, 785, 803, 808, 816,
+  770,
+  769, 780, 803, 807, 817,
+  769, 780, 803, 807, 813, 817,
+  769, 775, 803,
+  768, 769, 771, 775, 780, 803, 807, 813, 817,
+  768, 769, 770, 771, 772, 774, 775, 776, 777, 779, 780, 783, 785, 795, 803, 808,
+  769, 775,
+  769, 775, 780, 783, 785, 803, 807, 817,
+  769, 770, 775, 780, 803, 806, 807,
+  775, 780, 803, 806, 807, 813, 817,
+  768, 769, 770, 771, 772, 774, 776, 777, 778, 779, 780, 783, 785, 795, 803, 804, 808, 813, 816,
+  771, 803,
+  768, 769, 770, 775, 776, 803,
+  775, 776,
+  768, 769, 770, 771, 772, 775, 776, 777, 803,
+  769, 770, 775, 780, 803, 817,
+  768, 769, 770, 771, 772, 774, 775, 776, 777, 778, 780, 783, 785, 803, 805, 808,
+  775, 803, 817,
+  769, 770, 775, 780, 807,
+  775, 780, 803, 807, 813, 817,
+  768, 769, 770, 771, 772, 774, 775, 776, 777, 780, 783, 785, 803, 807, 808, 813, 816,
+  775,
+  769, 770, 772, 774, 775, 780, 807,
+  770, 775, 776, 780, 803, 807, 814, 817,
+  768, 769, 770, 771, 772, 774, 776, 777, 780, 783, 785, 803, 808, 816,
+  770, 780,
+  769, 780, 803, 807, 817,
+  769, 780, 803, 807, 813, 817,
+  769, 775, 803,
+  768, 769, 771, 775, 780, 803, 807, 813, 817,
+  768, 769, 770, 771, 772, 774, 775, 776, 777, 779, 780, 783, 785, 795, 803, 808,
+  769, 775,
+  769, 775, 780, 783, 785, 803, 807, 817,
+  769, 770, 775, 780, 803, 806, 807,
+  775, 776, 780, 803, 806, 807, 813, 817,
+  768, 769, 770, 771, 772, 774, 776, 777, 778, 779, 780, 783, 785, 795, 803, 804, 808, 813, 816,
+  771, 803,
+  768, 769, 770, 775, 776, 778, 803,
+  775, 776,
+  768, 769, 770, 771, 772, 775, 776, 777, 778, 803,
+  769, 770, 775, 780, 803, 817,
+  768, 769, 834,
+  768, 769, 771, 777,
+  772,
+  769,
+  769, 772,
+  769,
+  768, 769, 771, 777,
+  769,
+  768, 769, 771, 777,
+  769, 772, 776,
+  772,
+  769,
+  768, 769, 772, 780,
+  768, 769, 771, 777,
+  772,
+  769,
+  769, 772,
+  769,
+  768, 769, 771, 777,
+  769,
+  768, 769, 771, 777,
+  769, 772, 776,
+  772,
+  769,
+  768, 769, 772, 780,
+  768, 769, 771, 777,
+  768, 769, 771, 777,
+  768, 769,
+  768, 769,
+  768, 769,
+  768, 769,
+  775,
+  775,
+  775,
+  775,
+  769,
+  769,
+  776,
+  776,
+  775,
+  768, 769, 771, 777, 803,
+  768, 769, 771, 777, 803,
+  768, 769, 771, 777, 803,
+  768, 769, 771, 777, 803,
+  780,
+  772,
+  772,
+  772,
+  772,
+  774,
+  774,
+  772,
+  772,
+  780,
+  768, 769, 772, 774, 787, 788, 837,
+  768, 769, 787, 788,
+  768, 769, 787, 788, 837,
+  768, 769, 772, 774, 776, 787, 788,
+  768, 769, 787, 788,
+  788,
+  768, 769, 772, 774, 776, 788,
+  768, 769, 787, 788, 837,
+  837,
+  837,
+  768, 769, 772, 774, 787, 788, 834, 837,
+  768, 769, 787, 788,
+  768, 769, 787, 788, 834, 837,
+  768, 769, 772, 774, 776, 787, 788, 834,
+  768, 769, 787, 788,
+  787, 788,
+  768, 769, 772, 774, 776, 787, 788, 834,
+  768, 769, 787, 788, 834, 837,
+  768, 769, 834,
+  768, 769, 834,
+  837,
+  769, 776,
+  776,
+  774, 776,
+  769,
+  768, 774, 776,
+  774, 776,
+  776,
+  768, 772, 774, 776,
+  769,
+  776,
+  772, 774, 776, 779,
+  776,
+  776,
+  776,
+  774, 776,
+  769,
+  768, 774, 776,
+  774, 776,
+  776,
+  768, 772, 774, 776,
+  769,
+  776,
+  772, 774, 776, 779,
+  776,
+  776,
+  776,
+  776,
+  783,
+  783,
+  776,
+  776,
+  776,
+  776,
+  1619, 1620, 1621,
+  1620,
+  1620,
+  1620,
+  1620,
+  1620,
+  2364,
+  2364,
+  2364,
+  2494, 2519,
+  2878, 2902, 2903,
+  3031,
+  3006, 3031,
+  3006,
+  3158,
+  3285,
+  3266, 3285, 3286,
+  3285,
+  3390, 3415,
+  3390,
+  3530, 3535, 3551,
+  3530,
+  4142,
+  6965,
+  6965,
+  6965,
+  6965,
+  6965,
+  6965,
+  6965,
+  6965,
+  6965,
+  6965,
+  6965,
+  772,
+  772,
+  772,
+  772,
+  775,
+  775,
+  770, 774,
+  770, 774,
+  770,
+  770,
+  770,
+  770,
+  768, 769, 834, 837,
+  768, 769, 834, 837,
+  837,
+  837,
+  837,
+  837,
+  837,
+  837,
+  768, 769, 834, 837,
+  768, 769, 834, 837,
+  837,
+  837,
+  837,
+  837,
+  837,
+  837,
+  768, 769,
+  768, 769,
+  768, 769,
+  768, 769,
+  768, 769, 834, 837,
+  768, 769, 834, 837,
+  837,
+  837,
+  837,
+  837,
+  837,
+  837,
+  768, 769, 834, 837,
+  768, 769, 834, 837,
+  837,
+  837,
+  837,
+  837,
+  837,
+  837,
+  768, 769, 834,
+  768, 769, 834,
+  768, 769, 834,
+  768, 769, 834,
+  768, 769,
+  768, 769,
+  768, 769,
+  768, 769,
+  768, 769, 834,
+  768, 769, 834,
+  768, 769, 834,
+  768, 769, 834, 837,
+  768, 769, 834, 837,
+  837,
+  837,
+  837,
+  837,
+  837,
+  837,
+  768, 769, 834, 837,
+  768, 769, 834, 837,
+  837,
+  837,
+  837,
+  837,
+  837,
+  837,
+  837,
+  837,
+  837,
+  837,
+  768, 769, 834,
+  837,
+  837,
+  768, 769, 834,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  824,
+  12441,
+  12441,
+  12441,
+  12441,
+  12441,
+  12441,
+  12441,
+  12441,
+  12441,
+  12441,
+  12441,
+  12441,
+  12441,
+  12441,
+  12441,
+  12441,
+  12441, 12442,
+  12441, 12442,
+  12441, 12442,
+  12441, 12442,
+  12441, 12442,
+  12441,
+  12441,
+  12441,
+  12441,
+  12441,
+  12441,
+  12441,
+  12441,
+  12441,
+  12441,
+  12441,
+  12441,
+  12441,
+  12441,
+  12441,
+  12441,
+  12441,
+  12441, 12442,
+  12441, 12442,
+  12441, 12442,
+  12441, 12442,
+  12441, 12442,
+  12441,
+  12441,
+  12441,
+  12441,
+  12441,
+  775,
+  775,
+  69818,
+  69818,
+  69818,
+  69927,
+  69927,
+  70462, 70487,
+  70601,
+  70587,
+  70594,
+  70601,
+  70584, 70594, 70601,
+  70832, 70842, 70845,
+  71087,
+  71087,
+  71984,
+  90398, 90399, 90400, 90409,
+  90399, 90400,
+  90399,
+  90399,
+  93543,
+  93543,
+  93543,
+};
+
+static const utf8proc_uint32_t utf8proc_combinations_combined[] = {
+  8814,
+  8800,
+  8815,
+  192, 193, 194, 195, 256, 258, 550, 196, 7842, 197, 461, 512, 514, 7840, 7680, 260,
+  7682, 7684, 7686,
+  262, 264, 266, 268, 199,
+  7690, 270, 7692, 7696, 7698, 7694,
+  200, 201, 202, 7868, 274, 276, 278, 203, 7866, 282, 516, 518, 7864, 552, 280, 7704, 7706,
+  7710,
+  500, 284, 7712, 286, 288, 486, 290,
+  292, 7714, 7718, 542, 7716, 7720, 7722,
+  204, 205, 206, 296, 298, 300, 304, 207, 7880, 463, 520, 522, 7882, 302, 7724,
+  308,
+  7728, 488, 7730, 310, 7732,
+  313, 317, 7734, 315, 7740, 7738,
+  7742, 7744, 7746,
+  504, 323, 209, 7748, 327, 7750, 325, 7754, 7752,
+  210, 211, 212, 213, 332, 334, 558, 214, 7886, 336, 465, 524, 526, 416, 7884, 490,
+  7764, 7766,
+  340, 7768, 344, 528, 530, 7770, 342, 7774,
+  346, 348, 7776, 352, 7778, 536, 350,
+  7786, 356, 7788, 538, 354, 7792, 7790,
+  217, 218, 219, 360, 362, 364, 220, 7910, 366, 368, 467, 532, 534, 431, 7908, 7794, 370, 7798, 7796,
+  7804, 7806,
+  7808, 7810, 372, 7814, 7812, 7816,
+  7818, 7820,
+  7922, 221, 374, 7928, 562, 7822, 376, 7926, 7924,
+  377, 7824, 379, 381, 7826, 7828,
+  224, 225, 226, 227, 257, 259, 551, 228, 7843, 229, 462, 513, 515, 7841, 7681, 261,
+  7683, 7685, 7687,
+  263, 265, 267, 269, 231,
+  7691, 271, 7693, 7697, 7699, 7695,
+  232, 233, 234, 7869, 275, 277, 279, 235, 7867, 283, 517, 519, 7865, 553, 281, 7705, 7707,
+  7711,
+  501, 285, 7713, 287, 289, 487, 291,
+  293, 7715, 7719, 543, 7717, 7721, 7723, 7830,
+  236, 237, 238, 297, 299, 301, 239, 7881, 464, 521, 523, 7883, 303, 7725,
+  309, 496,
+  7729, 489, 7731, 311, 7733,
+  314, 318, 7735, 316, 7741, 7739,
+  7743, 7745, 7747,
+  505, 324, 241, 7749, 328, 7751, 326, 7755, 7753,
+  242, 243, 244, 245, 333, 335, 559, 246, 7887, 337, 466, 525, 527, 417, 7885, 491,
+  7765, 7767,
+  341, 7769, 345, 529, 531, 7771, 343, 7775,
+  347, 349, 7777, 353, 7779, 537, 351,
+  7787, 7831, 357, 7789, 539, 355, 7793, 7791,
+  249, 250, 251, 361, 363, 365, 252, 7911, 367, 369, 468, 533, 535, 432, 7909, 7795, 371, 7799, 7797,
+  7805, 7807,
+  7809, 7811, 373, 7815, 7813, 7832, 7817,
+  7819, 7821,
+  7923, 253, 375, 7929, 563, 7823, 255, 7927, 7833, 7925,
+  378, 7825, 380, 382, 7827, 7829,
+  8173, 901, 8129,
+  7846, 7844, 7850, 7848,
+  478,
+  506,
+  508, 482,
+  7688,
+  7872, 7870, 7876, 7874,
+  7726,
+  7890, 7888, 7894, 7892,
+  7756, 556, 7758,
+  554,
+  510,
+  475, 471, 469, 473,
+  7847, 7845, 7851, 7849,
+  479,
+  507,
+  509, 483,
+  7689,
+  7873, 7871, 7877, 7875,
+  7727,
+  7891, 7889, 7895, 7893,
+  7757, 557, 7759,
+  555,
+  511,
+  476, 472, 470, 474,
+  7856, 7854, 7860, 7858,
+  7857, 7855, 7861, 7859,
+  7700, 7702,
+  7701, 7703,
+  7760, 7762,
+  7761, 7763,
+  7780,
+  7781,
+  7782,
+  7783,
+  7800,
+  7801,
+  7802,
+  7803,
+  7835,
+  7900, 7898, 7904, 7902, 7906,
+  7901, 7899, 7905, 7903, 7907,
+  7914, 7912, 7918, 7916, 7920,
+  7915, 7913, 7919, 7917, 7921,
+  494,
+  492,
+  493,
+  480,
+  481,
+  7708,
+  7709,
+  560,
+  561,
+  495,
+  8122, 902, 8121, 8120, 7944, 7945, 8124,
+  8136, 904, 7960, 7961,
+  8138, 905, 7976, 7977, 8140,
+  8154, 906, 8153, 8152, 938, 7992, 7993,
+  8184, 908, 8008, 8009,
+  8172,
+  8170, 910, 8169, 8168, 939, 8025,
+  8186, 911, 8040, 8041, 8188,
+  8116,
+  8132,
+  8048, 940, 8113, 8112, 7936, 7937, 8118, 8115,
+  8050, 941, 7952, 7953,
+  8052, 942, 7968, 7969, 8134, 8131,
+  8054, 943, 8145, 8144, 970, 7984, 7985, 8150,
+  8056, 972, 8000, 8001,
+  8164, 8165,
+  8058, 973, 8161, 8160, 971, 8016, 8017, 8166,
+  8060, 974, 8032, 8033, 8182, 8179,
+  8146, 912, 8151,
+  8162, 944, 8167,
+  8180,
+  979, 980,
+  1031,
+  1232, 1234,
+  1027,
+  1024, 1238, 1025,
+  1217, 1244,
+  1246,
+  1037, 1250, 1049, 1252,
+  1036,
+  1254,
+  1262, 1038, 1264, 1266,
+  1268,
+  1272,
+  1260,
+  1233, 1235,
+  1107,
+  1104, 1239, 1105,
+  1218, 1245,
+  1247,
+  1117, 1251, 1081, 1253,
+  1116,
+  1255,
+  1263, 1118, 1265, 1267,
+  1269,
+  1273,
+  1261,
+  1111,
+  1142,
+  1143,
+  1242,
+  1243,
+  1258,
+  1259,
+  1570, 1571, 1573,
+  1572,
+  1574,
+  1730,
+  1747,
+  1728,
+  2345,
+  2353,
+  2356,
+  2507, 2508,
+  2891, 2888, 2892,
+  2964,
+  3018, 3020,
+  3019,
+  3144,
+  3264,
+  3274, 3271, 3272,
+  3275,
+  3402, 3404,
+  3403,
+  3546, 3548, 3550,
+  3549,
+  4134,
+  6918,
+  6920,
+  6922,
+  6924,
+  6926,
+  6930,
+  6971,
+  6973,
+  6976,
+  6977,
+  6979,
+  7736,
+  7737,
+  7772,
+  7773,
+  7784,
+  7785,
+  7852, 7862,
+  7853, 7863,
+  7878,
+  7879,
+  7896,
+  7897,
+  7938, 7940, 7942, 8064,
+  7939, 7941, 7943, 8065,
+  8066,
+  8067,
+  8068,
+  8069,
+  8070,
+  8071,
+  7946, 7948, 7950, 8072,
+  7947, 7949, 7951, 8073,
+  8074,
+  8075,
+  8076,
+  8077,
+  8078,
+  8079,
+  7954, 7956,
+  7955, 7957,
+  7962, 7964,
+  7963, 7965,
+  7970, 7972, 7974, 8080,
+  7971, 7973, 7975, 8081,
+  8082,
+  8083,
+  8084,
+  8085,
+  8086,
+  8087,
+  7978, 7980, 7982, 8088,
+  7979, 7981, 7983, 8089,
+  8090,
+  8091,
+  8092,
+  8093,
+  8094,
+  8095,
+  7986, 7988, 7990,
+  7987, 7989, 7991,
+  7994, 7996, 7998,
+  7995, 7997, 7999,
+  8002, 8004,
+  8003, 8005,
+  8010, 8012,
+  8011, 8013,
+  8018, 8020, 8022,
+  8019, 8021, 8023,
+  8027, 8029, 8031,
+  8034, 8036, 8038, 8096,
+  8035, 8037, 8039, 8097,
+  8098,
+  8099,
+  8100,
+  8101,
+  8102,
+  8103,
+  8042, 8044, 8046, 8104,
+  8043, 8045, 8047, 8105,
+  8106,
+  8107,
+  8108,
+  8109,
+  8110,
+  8111,
+  8114,
+  8130,
+  8178,
+  8119,
+  8141, 8142, 8143,
+  8135,
+  8183,
+  8157, 8158, 8159,
+  8602,
+  8603,
+  8622,
+  8653,
+  8655,
+  8654,
+  8708,
+  8713,
+  8716,
+  8740,
+  8742,
+  8769,
+  8772,
+  8775,
+  8777,
+  8813,
+  8802,
+  8816,
+  8817,
+  8820,
+  8821,
+  8824,
+  8825,
+  8832,
+  8833,
+  8928,
+  8929,
+  8836,
+  8837,
+  8840,
+  8841,
+  8930,
+  8931,
+  8876,
+  8877,
+  8878,
+  8879,
+  8938,
+  8939,
+  8940,
+  8941,
+  12436,
+  12364,
+  12366,
+  12368,
+  12370,
+  12372,
+  12374,
+  12376,
+  12378,
+  12380,
+  12382,
+  12384,
+  12386,
+  12389,
+  12391,
+  12393,
+  12400, 12401,
+  12403, 12404,
+  12406, 12407,
+  12409, 12410,
+  12412, 12413,
+  12446,
+  12532,
+  12460,
+  12462,
+  12464,
+  12466,
+  12468,
+  12470,
+  12472,
+  12474,
+  12476,
+  12478,
+  12480,
+  12482,
+  12485,
+  12487,
+  12489,
+  12496, 12497,
+  12499, 12500,
+  12502, 12503,
+  12505, 12506,
+  12508, 12509,
+  12535,
+  12536,
+  12537,
+  12538,
+  12542,
+  67017,
+  67044,
+  69786,
+  69788,
+  69803,
+  69934,
+  69935,
+  70475, 70476,
+  70531,
+  70533,
+  70542,
+  70545,
+  70599, 70597, 70600,
+  70844, 70843, 70846,
+  71098,
+  71099,
+  71992,
+  90401, 90403, 90405, 90402,
+  90406, 90408,
+  90407,
+  90404,
+  93545,
+  93544,
+  93546,
 };